package aplicacion;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;

import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;

import dominio.Aeropuerto;
import dominio.Hotel;
import dominio.PaqueteDeViaje;
import extras.AppendingObjectOutputStream;
import extras.DatePicker;
import net.miginfocom.swing.MigLayout;

public class MenuPaquete {
	private JPanel panelPrincipal;
	private JPanel panelIzquierda;
	private JPanel panelCentro;
	private JPanel panelArriba;
	private JTextField txtTxtbuscar;
	private JTable table;

	MenuPaquete(){
		panelPrincipal = new JPanel();
		panelPrincipal.setLayout( new BorderLayout() );
		cargarPanelArriba();
		cargarPanelIzquierda();
		cargarPanelMedio();
	}
	
	public void cargarPanelArriba(){
		panelArriba = new JPanel();
		panelArriba.setLayout(new MigLayout("", "[grow][]", "[]"));
		
		txtTxtbuscar = new JTextField();
		txtTxtbuscar.setPreferredSize(new Dimension(4, 25));
		panelArriba.add(txtTxtbuscar, "cell 0 0,growx");
		txtTxtbuscar.setColumns(10);
		{
			JButton btbBuscar = new JButton("Buscar");
			btbBuscar.setIcon(new ImageIcon(MenuCliente.class.getResource("/aplicacion/imagenes/buscar.png")));
			panelArriba.add(btbBuscar, "cell 1 0,alignx right");
			
		}
		panelPrincipal.add(panelArriba, BorderLayout.NORTH);
	}
	
	public void cargarPanelIzquierda(){
		panelIzquierda = new JPanel();
		panelIzquierda.setLayout(new MigLayout());
		{
			JButton btbAgregar = new JButton("Agregar");
			btbAgregar.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					new MenuAgregarPaquete().setVisible(true); 
					cargarPanelMedio();
				}
			});
			btbAgregar.setIconTextGap(12);
			btbAgregar.setHorizontalAlignment(SwingConstants.LEFT);
			btbAgregar.setHorizontalTextPosition(SwingConstants.LEFT);
			btbAgregar.setIcon(new ImageIcon(MenuCliente.class.getResource("/aplicacion/imagenes/agregar_paquete.png")));
			panelIzquierda.add(btbAgregar, "cell 0 0,growx,aligny top");
			
			JButton btbModificar = new JButton("Modificar");
			btbModificar.setHorizontalAlignment(SwingConstants.LEFT);
			btbModificar.setHorizontalTextPosition(SwingConstants.LEFT);
			btbModificar.setIcon(new ImageIcon(MenuCliente.class.getResource("/aplicacion/imagenes/modificar_cliente.png")));
			panelIzquierda.add(btbModificar, "cell 0 1,alignx left,growy");

			JButton btbEliminar = new JButton("Eliminar");
			btbEliminar.setIconTextGap(12);
			btbEliminar.setHorizontalAlignment(SwingConstants.LEFT);
			btbEliminar.setHorizontalTextPosition(SwingConstants.LEFT);
			btbEliminar.setIcon(new ImageIcon(MenuCliente.class.getResource("/aplicacion/imagenes/borrar_paquete.png")));
			panelIzquierda.add(btbEliminar, "cell 0 2,grow");
		}	
		panelPrincipal.add(panelIzquierda, BorderLayout.WEST);
	}
	
	public void cargarPanelMedio(){
		panelCentro = new JPanel();
		panelCentro.setLayout( new GridLayout() );
		panelPrincipal.add(panelCentro, BorderLayout.CENTER);
		String[] columnNames = {"ID Viaje","Aeropuerto Salida","Fecha Salida",
				"Aeropuerto Arrivo","Fecha Arrivo","Hotel",};
		table = new JTable(new DefaultTableModel(null, columnNames));
		try {
			agregarFila();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		JScrollPane scrollPane = new JScrollPane(table);
		panelCentro.add(scrollPane);		
	}
	
	void agregarFila() throws ClassNotFoundException, IOException{
		File file = new File("bin/aplicacion/archivos/paquetes.txt");
		if (file.exists()){
			DefaultTableModel defaultModel = (DefaultTableModel) table.getModel();  
			ObjectInputStream ois = null;
			try{
				ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));
				while(true){
					PaqueteDeViaje p = (PaqueteDeViaje) ois.readObject();
					defaultModel.addRow(new Object[]{ p.getIdViaje().toString(),
													p.getAeropuertoSalida().toString(),
													p.getFechaSalida().toString() + " " +
													p.getHoraSalida().toString(),
													p.getAuropuertaArrivo().toString(),
													p.getFechaArrivo().toString() + " " +
													p.getHoraArrivo().toString(),
													p.getHotel(),
													});
					}
			}catch(EOFException e){
				
			}finally{
				if(ois != null){
					ois.close();
				}
			}
			table = new JTable(defaultModel);
		}   
	}

	public JPanel getPanel() {
		return panelPrincipal;
	}

	public void setPanel(JPanel panel) {
		this.panelPrincipal = panel;
	}

}

@SuppressWarnings("serial")
class MenuAgregarPaquete extends JFrame {
	private JTextField txtIdViaje;
	private JTextField txtFechaIda;
	private JTextField txtFechaVuelta;
	private JTextField txtHoraSalida;
	private JTextField txtHoraLlegada;
	private JComboBox cbxAeropuertoOrigen;
	private JComboBox cbxAeropuertoDestino;
	private JComboBox cbxHotel;
	
	MenuAgregarPaquete(){
		setSize(400, 350);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		getContentPane().setLayout(new MigLayout());
		cargarCombobox();
		
		JLabel lblIdViaje = new JLabel("ID Viaje:");
		txtIdViaje = new JTextField();
		txtIdViaje.setMinimumSize(new Dimension(200,25));
		add(lblIdViaje, "cell 0 0");
		add(txtIdViaje, "cell 1 0, growx");		
		
		JLabel lblNombreAeropuertoOrigen = new JLabel("Aeropuerto Origen:");
		cbxAeropuertoOrigen.setMinimumSize(new Dimension(190,20));
		add(cbxAeropuertoOrigen, "cell 1 4, growx");
		add(lblNombreAeropuertoOrigen, "cell 0 4");
	
		JLabel lblNombreAeropuertoDestino = new JLabel("Aeropuerto Destino:");
		cbxAeropuertoDestino.setMinimumSize(new Dimension(190,20));
		add(cbxAeropuertoDestino, "cell 1 8, growx");
		add(lblNombreAeropuertoDestino, "cell 0 8");
		
		JLabel lblFechaIda = new JLabel("Fecha Ida:");
		JButton btbFechaIda = new JButton("...");
		txtFechaIda = new JTextField();
		txtFechaIda.setText("dd/mm/aaaa");
		txtFechaIda.setMinimumSize(new Dimension(50,25));
		btbFechaIda.setMaximumSize(new Dimension(20,25));
		btbFechaIda.setMinimumSize(new Dimension(20,25));
		btbFechaIda.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				DatePicker dp = new DatePicker(MenuAgregarPaquete.this);
				txtFechaIda.setText(dp.setPickedDate());
			}
		});
		add(lblFechaIda, "cell 0 9");
		add(txtFechaIda, "cell 1 9, growx");
		add(btbFechaIda, "cell 1 9");
		
		JLabel lblHoraSalida = new JLabel("Hora Ida:");
		txtHoraSalida = new JTextField();
		txtHoraSalida.setText("hh:mm");
		txtHoraSalida.setMinimumSize(new Dimension(50,25));
		add(lblHoraSalida, "cell 0 10");
		add(txtHoraSalida, "cell 1 10, growx");

		
		JLabel lblFechaVuelta = new JLabel("Fecha Vuelta:");
		JButton btbFechaVuelta = new JButton("...");
		txtFechaVuelta = new JTextField();
		txtFechaVuelta.setText("dd/mm/aaaa");
		txtFechaVuelta.setMinimumSize(new Dimension(50,25));
		btbFechaVuelta.setMaximumSize(new Dimension(20,25));
		btbFechaVuelta.setMinimumSize(new Dimension(20,25));
		btbFechaVuelta.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				DatePicker dp = new DatePicker(MenuAgregarPaquete.this);
				txtFechaVuelta.setText(dp.setPickedDate());
			}
		});
		add(lblFechaVuelta, "cell 0 11");
		add(txtFechaVuelta, "cell 1 11, growx");
		add(btbFechaVuelta, "cell 1 11");
		
		JLabel lblHoraLlegada = new JLabel("Hora Vuelta:");	
		txtHoraLlegada = new JTextField();
		txtHoraLlegada.setText("hh:mm");
		txtHoraLlegada.setMinimumSize(new Dimension(50,25));
		add(lblHoraLlegada, "cell 0 12");
		add(txtHoraLlegada, "cell 1 12, growx");
		
		JLabel lblHotel = new JLabel("Hotel:");
		cbxHotel.setMinimumSize(new Dimension(190,20));
		add(lblHotel, "cell 0 13");
		add(cbxHotel, "cell 1 13, growx");	
	
		JButton btbAgregar = new JButton("Agregar");
		btbAgregar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if(validarPaquete())guardarPaquete();
			}
		});
		add(btbAgregar, "cell 1 14");
	
		
	}
	
	void cargarCombobox(){
		Aeropuerto[] listaAeropuerto = {
				new Aeropuerto(1111, "Aeropuerto de Ezeiza", "Ezeiza", "Buenos Aires", "Argentina"), 
				new Aeropuerto(2222, "Aeropuerto de Sao Paulo", "Guarulhos", "Sao Paulo", "Brasil")
				};
		
		Hotel[] listaHotel = {
				new Hotel(1111, "Sheraton", null, 100),
				new Hotel(2222, "Marriot Plaza", null, 100)
				};	
		
		DefaultComboBoxModel model1 = new DefaultComboBoxModel(listaAeropuerto);
		cbxAeropuertoOrigen = new JComboBox(model1);
		cbxAeropuertoOrigen.setSelectedIndex(0);
		cbxAeropuertoOrigen.setMaximumSize((new Dimension(250,25)));
		
		DefaultComboBoxModel model2 = new DefaultComboBoxModel(listaAeropuerto);	
		cbxAeropuertoDestino = new JComboBox(model2);
		cbxAeropuertoDestino.setSelectedIndex(1);
		cbxAeropuertoDestino.setMaximumSize((new Dimension(250,25)));
		
		DefaultComboBoxModel model3 = new DefaultComboBoxModel(listaHotel);	
		cbxHotel = new JComboBox(model3);
		cbxHotel.setSelectedIndex(0);
		cbxHotel.setMaximumSize((new Dimension(250,25)));
	}
	boolean validarPaquete(){
		try {
			validarNumero(txtIdViaje.getText(), "ID Viaje");
			validarFecha(txtFechaIda.getText(), "Fecha Ida");
			validarHora(txtHoraSalida.getText(), "Hora Ida");
			validarFecha(txtFechaVuelta.getText(), "Fecha Vuelta");
			validarHora(txtHoraLlegada.getText(), "Hora Vuelta");		
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), null, JOptionPane.ERROR_MESSAGE);
			return false;
		}
		return true;
	}
	
	void guardarPaquete(){
		ObjectOutputStream oos = null;	
		File file = new File("bin/aplicacion/archivos/paquetes.txt");
		try{
			if (file.exists()) {
				oos = new AppendingObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file,true)));
			} else {
				oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file,true)));
			}

			PaqueteDeViaje pdv = new PaqueteDeViaje();
			pdv.setIdViaje(new Integer(txtIdViaje.getText()));
			
			pdv.setFechaSalida(txtFechaIda.getText());
			
			pdv.setFechaArrivo(txtFechaVuelta.getText());
			
			pdv.setHoraSalida(txtHoraSalida.getText());
			pdv.setHoraArrivo(txtHoraLlegada.getText());
			
			pdv.setAeropuertoSalida((Aeropuerto) cbxAeropuertoOrigen.getSelectedItem());
			pdv.setAuropuertaArrivo((Aeropuerto) cbxAeropuertoDestino.getSelectedItem());
			
			pdv.setHotel((Hotel) cbxHotel.getSelectedItem());
			
			oos.writeObject(pdv);
			JOptionPane.showMessageDialog(null, "Paquete cargado!", null, JOptionPane.INFORMATION_MESSAGE);
			MenuAgregarPaquete.this.dispose();
		} catch (IOException e ) {
			e.printStackTrace();
		} finally{
			if(oos != null){
				try {
					oos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}					
		} 
		
	}
	
	 void validarFecha(String fecha, String campo) throws Exception {
        try {
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
            formatoFecha.setLenient(false);
            formatoFecha.parse(fecha);
        } catch (ParseException e) {
        	throw new Exception("Formato de fecha no valido para el campo \"" + campo + "\"" );
        }
	 }
		
	 void validarNumero(String s, String campo) throws Exception {
	     try { 
	         Integer.parseInt(s); 
	     } catch(NumberFormatException e) { 
	    	 throw new Exception("El campo \"" + campo + "\" deben ser solo numeros.");
	     }
	 }
	 
	 void validarHora(String s, String campo) throws Exception {
		 Integer hora;
		 Integer minuto;
		 if(s.matches("[0-9][0-9]:[0-9][0-9]")){
		     try { 
		    	 hora = Integer.parseInt(s.substring(0, 2)); 
		    	 minuto = Integer.parseInt(s.substring(3, 5));
		     } catch(NumberFormatException e) { 
		    	 throw new Exception("Formato de hora incorrecto para el campo \"" + campo + "\"");
		     }	     
		     if (( hora < 0 || hora > 24) || ( minuto < 0 || minuto > 59)){
		    	 throw new Exception("Formato de hora incorrecto para el campo \"" + campo + "\"");
		     }
		 } else {
			 throw new Exception("Formato de hora incorrecto para el campo \"" + campo + "\"");
		 }
	 }


}
